// eslint-disable-next-line no-control-regex
const rControl = /[\u0000-\u001f]/g
const rSpecial = /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'<>,.?/]+/g

/**
 * slugify 函数生成一个干净、规范化的字符串
 * 1、移除控制字符。
 * 2、将特殊字符替换为连字符。
 * 3、移除连续的连字符。
 * 4、移除前缀和后缀的连字符。
 * 5、确保字符串不以数字开头。
 * 6、将字符串转换为小写。
 * */
export const slugify = (str: string): string => {
	return (
		str
			// Remove control characters
			.replace(rControl, '')
			// Replace special characters
			.replace(rSpecial, '-')
			// Remove continuos separators
			.replace(/\-{2,}/g, '-')
			// Remove prefixing and trailing separtors
			.replace(/^\-+|\-+$/g, '')
			// ensure it doesn't start with a number (#121)
			.replace(/^(\d)/, '_$1')
			// lowercase
			.toLowerCase()
	)
}
